/**
 * Память микропрограмм.
 * @version $Id: MicrocommandMemory.java 178 2011-01-21 13:08:24Z MATPOCKuH $
 */

package Machine;

public class MicrocommandMemory extends Memory {

	public MicrocommandMemory(RegisterFactory factory)
	{
		super(factory.getMicroInstructionPointer(), 256, 16);
		
		int[] programm = {
/* 00 */		0x0000,
		// Цикл выборки команды
/* 01 */		0x0300,
/* 02 */		0x4001,
/* 03 */		0x0311,
/* 04 */		0x4004,
/* 05 */		0x0100,
/* 06 */		0x4003,
			// Определение типа команды
/* 07 */		0xAF0C,
/* 08 */		0xAE0C,
/* 09 */		0xAD0C,
/* 0A */		0xEC5E,
/* 0B */		0x838E,
			// Определение вида адресации
/* 0C */		0xAB1D,
		
		// Цикл выборки адреса операнда
/* 0D */		0x0100,
/* 0E */		0x4001,
/* 0F */		0x0001,
/* 10 */		0xA31D,
/* 11 */		0xE41D,
/* 12 */		0xE51D,
/* 13 */		0xE61D,
/* 14 */		0xE71D,
/* 15 */		0xE81D,
/* 16 */		0xE91D,
/* 17 */		0xEA1D,
/* 18 */		0x0110,
/* 19 */		0x4002,
/* 1A */		0x0002,
/* 1B */		0x0140,
/* 1C */		0x4002,
		
		// Цикл исполнения адресных команд
			// Декодирование адресных команд
/* 1D */		0xEF2D,
/* 1E */		0x0100,
/* 1F */		0x4001,
/* 20 */		0xEE27,
/* 21 */		0xAD24,
/* 22 */		0xAC57,
/* 23 */		0x8338,
/* 24 */		0x0001,
/* 25 */		0xAC50,
/* 26 */		0x8335,
/* 27 */		0x0001,
/* 28 */		0xAD2B,
/* 29 */		0xAC43,
/* 2A */		0x83B0,
/* 2B */		0xAC3C,
/* 2C */		0x833F,
/* 2D */		0xAE30,
/* 2E */		0xAC47,
/* 2F */		0x83D0,
/* 30 */		0xAD33,
/* 31 */		0xAC4C,
/* 32 */		0x834E,
/* 33 */		0xAC46,
/* 34 */		0x834A,
			// Исполнение адресных команд
/* 35 */		0x1120,
/* 36 */		0x4035,
/* 37 */		0x838F,
/* 38 */		0x1000,
/* 39 */		0x4002,
/* 3A */		0x0002,
/* 3B */		0x838F,
/* 3C */		0x1100,
/* 3D */		0x4075,
/* 3E */		0x838F,
/* 3F */		0x803C,
/* 40 */		0x1110,
/* 41 */		0x4075,
/* 42 */		0x838F,
/* 43 */		0x1190,
/* 44 */		0x4075,
/* 45 */		0x838F,
/* 46 */		0x808F,
/* 47 */		0x0100,
/* 48 */		0x4004,
/* 49 */		0x838F,
/* 4A */		0xC28F,
/* 4B */		0x8347,
/* 4C */		0x828F,
/* 4D */		0x8347,
/* 4E */		0x818F,
/* 4F */		0x8347,
/* 50 */		0x0110,
/* 51 */		0x4002,
/* 52 */		0x0002,
/* 53 */		0xDF8F,
/* 54 */		0x0310,
/* 55 */		0x4004,
/* 56 */		0x838F,
/* 57 */		0x0110,
/* 58 */		0x4003,
/* 59 */		0x0300,
/* 5A */		0x4002,
/* 5B */		0x0202,
/* 5C */		0x4004,
/* 5D */		0x838F,
		
		// Продолжение цикла выборки команды
		// Декодирование и исполнение безадресных команд
/* 5E */		0xAB61,
/* 5F */		0xAA6C,
/* 60 */		0x83E0,
/* 61 */		0xAA67,
/* 62 */		0xA965,
/* 63 */		0xA882,
/* 64 */		0x8385,
/* 65 */		0xA87B,
/* 66 */		0x837E,
/* 67 */		0xA96A,
/* 68 */		0xA876,
/* 69 */		0x8379,
/* 6A */		0xA888,
/* 6B */		0x8387,
/* 6C */		0xA96F,
/* 6D */		0xA88A,
/* 6E */		0x838C,
/* 6F */		0xA873,
/* 70 */		0x1080,
/* 71 */		0x4075,
/* 72 */		0x838F,
/* 73 */		0x1010,
/* 74 */		0x4075,
/* 75 */		0x838F,
/* 76 */		0x0020,
/* 77 */		0x4035,
/* 78 */		0x838F,
/* 79 */		0x4080,
/* 7A */		0x838F,
/* 7B */		0x1040,
/* 7C */		0x4035,
/* 7D */		0x838F,
/* 7E */		0x8080,
/* 7F */		0x8379,
/* 80 */		0x40C0,
/* 81 */		0x838F,
/* 82 */		0x0008,
/* 83 */		0x4075,
/* 84 */		0x838F,
/* 85 */		0x0004,
/* 86 */		0x4075,
/* 87 */		0x838F,
/* 88 */		0x4008,
/* 89 */		0x8301,
/* 8A */		0x4800,
/* 8B */		0x8301,
/* 8C */		0x4400,
/* 8D */		0x8301,
		
		// Продолжение выборки команды
		// Декодирование и исполнение команд ввода-вывода
/* 8E */		0x4100,
			// Цикл прерывания
/* 8F */		0x8788,
/* 90 */		0x8501,
/* 91 */		0x0020,
/* 92 */		0x4001,
/* 93 */		0x0300,
/* 94 */		0x4002,
/* 95 */		0x0012,
/* 96 */		0x4004,
/* 97 */		0x4400,
/* 98 */		0x8301,
		
		// Пультовые операции
			// Ввод адреса
/* 99 */		0x3000,
/* 9A */		0x4004,
/* 9B */		0x8388,
			// Чтение
/* 9C */		0x0300,
/* 9D */		0x4001,
/* 9E */		0x0311,
/* 9F */		0x4004,
/* A0 */		0x8388,
			// Запись
/* A1 */		0x0300,
/* A2 */		0x4001,
/* A3 */		0x3000,
/* A4 */		0x4002,
/* A5 */		0x0312,
/* A6 */		0x4004,
/* A7 */		0x8388,
			// Пуск
/* A8 */		0x0020,
/* A9 */		0x4077,
/* AA */		0x4200,
/* AB */		0x4400,
/* AC */		0x838F,
		// Not used
/* AD */		0x0000,
/* AE */		0x0000,
/* AF */		0x0000,
		// Арифметическая команда 7###
/* B0 */		0x0000,
/* B1 */		0x0000,
/* B2 */		0x0000,
/* B3 */		0x0000,
/* B4 */		0x0000,
/* B5 */		0x0000,
/* B6 */		0x0000,
/* B7 */		0x0000,
/* B8 */		0x0000,
/* B9 */		0x0000,
/* BA */		0x0000,
/* BB */		0x0000,
/* BC */		0x0000,
/* BD */		0x0000,
/* BE */		0x0000,
/* BF */		0x0000,
/* C0 */		0x0000,
/* C1 */		0x0000,
/* C2 */		0x0000,
/* C3 */		0x0000,
/* C4 */		0x0000,
/* C5 */		0x0000,
/* C6 */		0x0000,
/* C7 */		0x0000,
/* C8 */		0x0000,
/* C9 */		0x0000,
/* CA */		0x0000,
/* CB */		0x0000,
/* CC */		0x0000,
/* CD */		0x0000,
/* CE */		0x0000,
/* CF */		0x0000,
		// Команда перехода D###
/* D0 */		0x0000,
/* D1 */		0x0000,
/* D2 */		0x0000,
/* D3 */		0x0000,
/* D4 */		0x0000,
/* D5 */		0x0000,
/* D6 */		0x0000,
/* D7 */		0x0000,
/* D8 */		0x0000,
/* D9 */		0x0000,
/* DA */		0x0000,
/* DB */		0x0000,
/* DC */		0x0000,
/* DD */		0x0000,
/* DE */		0x0000,
/* DF */		0x0000,
		// Безадресная команда FC##
/* E0 */		0x0000,
/* E1 */		0x0000,
/* E2 */		0x0000,
/* E3 */		0x0000,
/* E4 */		0x0000,
/* E5 */		0x0000,
/* E6 */		0x0000,
/* E7 */		0x0000,
/* E8 */		0x0000,
/* E9 */		0x0000,
/* EA */		0x0000,
/* EB */		0x0000,
/* EC */		0x0000,
/* ED */		0x0000,
/* EE */		0x0000,
/* EF */		0x0000,
/* F0 */		0x0000,
/* F1 */		0x0000,
/* F2 */		0x0000,
/* F3 */		0x0000,
/* F4 */		0x0000,
/* F5 */		0x0000,
/* F6 */		0x0000,
/* F7 */		0x0000,
/* F8 */		0x0000,
/* F9 */		0x0000,
/* FA */		0x0000,
/* FB */		0x0000,
/* FC */		0x0000,
/* FD */		0x0000,
/* FE */		0x0000,
/* FF */		0x0000
		};

		for (int k = 0; k < programm.length; k++)
		{
			super.SetValue(programm[k], k);
		}
	}
}
